if(!require(readxl)){install.packages("readxl")}; library(readxl) # Para leer archivos Excel
## Loading required package: readxl
if(!require(dplyr)){install.packages("dplyr")}; library(dplyr) # Manipulación
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
if(!require(chilemapas)){install.packages("chilemapas")}; library(chilemapas) # Mapa de Chile
## Loading required package: chilemapas
## Loading required package: sf
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
## La documentacion del paquete y ejemplos de uso se encuentran en https://pacha.dev/chilemapas/.
## Visita https://buymeacoffee.com/pacha/ si deseas donar para contribuir al desarrollo de este software.
if(!require(ggplot2)){install.packages("ggplot2")}; library(ggplot2) # Visualización
## Loading required package: ggplot2
if(!require(stringr)){install.packages("stringr")}; library(stringr) # Manipulación
## Loading required package: stringr
if(!require(stringi)){install.packages("stringi")}; library(stringi) # Manipulación
## Loading required package: stringi
if(!require(tools)){install.packages("tools")}; library(tools) # Manipulación
## Loading required package: tools
if(!require(gridExtra)){install.packages("gridExtra")}; library(gridExtra) # Visualización
## Loading required package: gridExtra
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
if(!require(cowplot)){install.packages("cowplot")}; library(cowplot) # Visualización
## Loading required package: cowplot
if(!require(rio)){install.packages("rio")}; library(rio) # Importar archivos desde GITHUB
## Loading required package: rio
if(!require(tidyr)){install.packages("tidyr")}; library(tidyr) # Manipulación
## Loading required package: tidyr
if(!require(plotly)){install.packages("plotly")}; library(plotly) # Visualización
## Loading required package: plotly
##
## Attaching package: 'plotly'
## The following object is masked from 'package:rio':
##
## export
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
dir.create("data", showWarnings = FALSE) #DATA
dir.create("output", showWarnings = FALSE) # RESULTADOS
dir.create("R", showWarnings = FALSE) # SCRIPT
dir.create("docs", showWarnings = FALSE) # Documentos
readme_content <- "# Análisis CASEN/SERVEL 2021
Análisis de la relación entre participación electoral y condiciones socioeconómicas en Chile.
por motivos de tamaño KB solo fue posible analizar servel y casen 2021.
## Estructura del Proyecto
- `data/`: Datos brutos de CASEN y SERVEL
- `output/`: Resultados y visualizaciones
- `R/`: Scripts de análisis
- `docs/`: Documentación adicional
## Equipo
- Ariel Álvarez
- Marcos González
- Arturo Zamorano"
writeLines(readme_content, "README.md")
# Crear los scripts principales de análisis
script_names <- c(
"01_load_data.R", # Para cargar los datos iniciales
"02_clean_data.R", # Para limpiar y preparar los datos
"03_analysis.R", # Para realizar los análisis principales
"04_visualizations.R" # Para crear gráficos y visualizaciones
)
for(script in script_names) {
file.path("R", script) %>%
file.create()
}
# Crear el contenido del script principal que configura el proyecto
load_data_content <- '# Configuración inicial del proyecto
if (!require("renv")) install.packages("renv")
renv::init()
# Instalar y cargar paquetes necesarios
packages <- c(
"tidyverse", # Para manipulación de datos
"readxl", # Para leer archivos Excel
"sf", # Para datos geográficos
"here", # Para manejo de rutas
"DiagrammeR", # Para diagramas ER
"usethis" # Para configuración de Git
)
# Instalar paquetes faltantes
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)
# Cargar paquetes
lapply(packages, library, character.only = TRUE)
# Configurar Git
usethis::use_git()
'
writeLines(load_data_content, file.path("R", "01_load_data.R"))
gitignore_content <- ".Rproj.user
.Rhistory
.RData
.Ruserdata
*.Rproj"
writeLines(gitignore_content, ".gitignore")
Presidencial 2021
metropolitana_2021_1 <- import("https://github.com/Arielo2518/Taller_2_final/raw/main/data/Servel/metropolitana_2021_primeravuelta.xlsx")
datos_comunas1_2021 <- metropolitana_2021_1 %>% # Selección de variables de interés
select(Distrito, Comuna, Local, Mesa, Inscritos, Votación) %>%
group_by(Distrito, Comuna)
datos_comunas1_2021_agrupado <- metropolitana_2021_1 %>% # Aquí generamos una variable nueva de % de participación
select(Distrito, Comuna, Local, Mesa, Inscritos, Votación) %>%
group_by(Distrito, Comuna) %>%
summarize(
Total_Inscritos = sum(as.numeric(Inscritos), na.rm = TRUE),
Total_Votacion = sum(as.numeric(Votación), na.rm = TRUE)
) %>%
mutate(Participacion_Porcentaje = round((Total_Votacion / Total_Inscritos) * 100, 1))
## `summarise()` has grouped output by 'Distrito'. You can override using the
## `.groups` argument.
eleccion_2021_primeravuelta <- datos_comunas1_2021_agrupado %>%
rename(comuna = Comuna) %>%
mutate(comuna = str_to_lower(comuna))
eleccion_2021_primeravuelta
## # A tibble: 52 × 5
## # Groups: Distrito [7]
## Distrito comuna Total_Inscritos Total_Votacion Participacion_Porcen…¹
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Distrito 10 la granja 102187 45371 44.4
## 2 Distrito 10 macul 100045 54600 54.6
## 3 Distrito 10 providencia 170892 96543 56.5
## 4 Distrito 10 san joaquin 80763 39445 48.8
## 5 Distrito 10 santiago 339067 136398 40.2
## 6 Distrito 10 ñuñoa 198985 123031 61.8
## 7 Distrito 11 la reina 90939 56792 62.5
## 8 Distrito 11 las condes 271386 171671 63.3
## 9 Distrito 11 lo barnech… 84259 55042 65.3
## 10 Distrito 11 peñalolen 190640 95956 50.3
## # ℹ 42 more rows
## # ℹ abbreviated name: ¹Participacion_Porcentaje
SEGUNDA VUELTA
metropolitana_2021_2 <- import("https://github.com/Arielo2518/Taller_2_final/raw/main/data/Servel/metropolitana_2021_segundavuelta.xlsx")
datos_comunas2_2021 <- metropolitana_2021_2 %>% # Selección de variables de interés
select(Distrito, Comuna, Local, Mesa, Inscritos, Votación) %>%
group_by(Distrito, Comuna)
datos_comunas2_2021_agrupado <- metropolitana_2021_2 %>% # Aquí generamos una variable nueva de % de participación
select(Distrito, Comuna, Local, Mesa, Inscritos, Votación) %>%
group_by(Distrito, Comuna) %>%
summarize(
Total_Inscritos = sum(as.numeric(Inscritos), na.rm = TRUE),
Total_Votacion = sum(as.numeric(Votación), na.rm = TRUE)
) %>%
mutate(Participacion_Porcentaje = round((Total_Votacion / Total_Inscritos) * 100, 1))
## `summarise()` has grouped output by 'Distrito'. You can override using the
## `.groups` argument.
eleccion_2021_segundavuelta <- datos_comunas2_2021_agrupado %>%
rename(comuna = Comuna) %>%
mutate(comuna = str_to_lower(comuna))
eleccion_2021_segundavuelta
## # A tibble: 52 × 5
## # Groups: Distrito [7]
## Distrito comuna Total_Inscritos Total_Votacion Participacion_Porcen…¹
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Distrito 10 la granja 102187 55913 54.7
## 2 Distrito 10 macul 100045 64016 64
## 3 Distrito 10 providencia 170892 104693 61.3
## 4 Distrito 10 san joaquin 80763 48040 59.5
## 5 Distrito 10 santiago 339067 158676 46.8
## 6 Distrito 10 ñuñoa 198985 139003 69.9
## 7 Distrito 11 la reina 90939 63597 69.9
## 8 Distrito 11 las condes 271386 184227 67.9
## 9 Distrito 11 lo barnech… 84259 59439 70.5
## 10 Distrito 11 peñalolen 190640 115888 60.8
## # ℹ 42 more rows
## # ℹ abbreviated name: ¹Participacion_Porcentaje
remove(datos_comunas1_2021, datos_comunas2_2021, datos_comunas1_2021_agrupado, datos_comunas2_2021_agrupado, metropolitana_2021_1, metropolitana_2021_2, datos_comunas1_2021, datos_comunas2_2021) # Borramos BBDD que ya no ocuparemos
geolocalización
eleccion_2021_primeravuelta <- eleccion_2021_primeravuelta %>% # Transformamos la var a numerica
mutate(Participacion_Porcentaje = as.numeric(Participacion_Porcentaje))
participacion_comuna <- eleccion_2021_primeravuelta %>%
filter(!is.na(Participacion_Porcentaje) & Participacion_Porcentaje >= 0) %>%
group_by(comuna) %>%
summarise(participacion_comuna = sum(Participacion_Porcentaje, na.rm = TRUE))
comunas_santiago <- mapa_comunas %>% #Desde chile mapas filtramos la RM
filter(codigo_region == 13) %>%
left_join(
codigos_territoriales %>%
select(matches("comuna"))
) %>%
mutate(nombre_comuna = str_trim(tolower(nombre_comuna))) %>% # Convertimos a minusculas para estandarizar
left_join(participacion_comuna %>%
mutate(comuna = str_trim(tolower(comuna))), by = c("nombre_comuna" = "comuna"))
## Joining with `by = join_by(codigo_comuna)`
paleta <- c("#DCA761", "#CFB567", "#BFBC71", "#9EA887", "#819897")
Gráfico_1 <- ggplot(comunas_santiago) +
geom_sf(aes(fill = participacion_comuna, geometry = geometry)) +
scale_fill_gradientn(colours = rev(paleta), name = "Porcentaje participación") +
labs(title = "Participación Electoral en 1era Vuelta 2021") +
theme_minimal(base_size = 13) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5)
)
Gráfico_1 <- ggplotly(Gráfico_1) # Gráfico interactivo
Gráfico_1
eleccion_2021_segundavuelta <- eleccion_2021_segundavuelta %>% # Transformamos la var a numerica
mutate(Participacion_Porcentaje = as.numeric(Participacion_Porcentaje))
participacion_comuna <- eleccion_2021_segundavuelta %>%
filter(!is.na(Participacion_Porcentaje) & Participacion_Porcentaje >= 0) %>%
group_by(comuna) %>%
summarise(participacion_comuna = sum(Participacion_Porcentaje, na.rm = TRUE))
comunas_santiago <- mapa_comunas %>% # Filtro desde Chile mapas
filter(codigo_region == 13) %>%
left_join(
codigos_territoriales %>%
select(matches("comuna"))
) %>%
mutate(nombre_comuna = str_trim(tolower(nombre_comuna))) %>% # Convertimos a minusculas para estandarizar
left_join(participacion_comuna %>%
mutate(comuna = str_trim(tolower(comuna))), by = c("nombre_comuna" = "comuna"))
## Joining with `by = join_by(codigo_comuna)`
paleta <- c("#DCA761", "#CFB567", "#BFBC71", "#9EA887", "#819897")
Gráfico_2 <- ggplot(comunas_santiago) +
geom_sf(aes(fill = participacion_comuna, geometry = geometry)) +
scale_fill_gradientn(colours = rev(paleta), name = "Porcentaje participación") +
labs(title = "Participación Electoral en 2da Vuelta 2021") +
theme_minimal(base_size = 13) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5)
)
Gráfico_2 <- ggplotly(Gráfico_2) # Gráfico interactivo
Gráfico_2
Gráficos Elecciones
# Gráfico 2021
Gráfico_3 <- plot_grid(
Gráfico_1 + theme(legend.position = "none"),
Gráfico_2 + theme(legend.position = "none"),
align = "v",
ncol = 2
)
# Usamos solo una leyenda dado que es la misma escala
leyenda <- get_legend(Gráfico_1)
## Warning in as_grob.default(plot): Cannot convert object of class
## plotlyhtmlwidget into a grob.
# Combinamos ambos gráficos
plot_grid(Gráfico_3, leyenda, ncol = 1, rel_heights = c(0.81, 0.5))
#################################################### ###################
CASEN #########################
###################################################
comuna_codes_rm <- c(
"13101" = "SANTIAGO",
"13102" = "CERRILLOS",
"13103" = "CERRO NAVIA",
"13104" = "CONCHALI",
"13105" = "EL BOSQUE",
"13106" = "ESTACION CENTRAL",
"13107" = "HUECHURABA",
"13108" = "INDEPENDENCIA",
"13109" = "LA CISTERNA",
"13110" = "LA FLORIDA",
"13111" = "LA GRANJA",
"13112" = "LA PINTANA",
"13113" = "LA REINA",
"13114" = "LAS CONDES",
"13115" = "LO BARNECHEA",
"13116" = "LO ESPEJO",
"13117" = "LO PRADO",
"13118" = "MACUL",
"13119" = "MAIPU",
"13120" = "NUNOA",
"13121" = "PEDRO AGUIRRE CERDA",
"13122" = "PENALOLEN",
"13123" = "PROVIDENCIA",
"13124" = "PUDAHUEL",
"13125" = "QUILICURA",
"13126" = "QUINTA NORMAL",
"13127" = "RECOLETA",
"13128" = "RENCA",
"13129" = "SAN JOAQUIN",
"13130" = "SAN MIGUEL",
"13131" = "SAN RAMON",
"13132" = "VITACURA",
"13201" = "PUENTE ALTO",
"13202" = "PIRQUE",
"13203" = "SAN JOSE DE MAIPO",
"13301" = "COLINA",
"13302" = "LAMPA",
"13303" = "TILTIL",
"13401" = "SAN BERNARDO",
"13402" = "BUIN",
"13403" = "CALERA DE TANGO",
"13404" = "PAINE",
"13501" = "MELIPILLA",
"13502" = "ALHUE",
"13503" = "CURACAVI",
"13504" = "MARIA PINTO",
"13505" = "SAN PEDRO",
"13601" = "TALAGANTE",
"13602" = "EL MONTE",
"13603" = "ISLA DE MAIPO",
"13604" = "PADRE HURTADO",
"13605" = "PENAFLOR"
)
comuna_codes_rm <- tibble::tibble(
comuna = names(comuna_codes_rm), # Extracción de los códigos de CASEN
nombre_comuna = unname(comuna_codes_rm) # Nombres
)
comuna_codes_rm <- comuna_codes_rm %>% # Los dejamos en minusculas para estandarizar
mutate(nombre_comuna = str_to_lower(nombre_comuna))
#Casen 2022 en sus notas para la investigación comtepla que “no está diseñada para ser representativa a nivel provincial o comunal, por lo que la base principal de Casen ha sido publicada sin incluir las variables de identificación # de estas dos unidades territoriales” sin embargo, estas variables se han puesto a disposición de las y los investigadores en una base de datos complementaria porque unimos ambas bases para identificar valores comunales de CASEN.
casen_2021_rm <- import("https://github.com/Arielo2518/Taller_2_final/raw/main/data/CASEN/casen_2021_rm.xlsx")
casen_comunas_2021 <- import("https://github.com/Arielo2518/Taller_2_final/raw/main/data/CASEN/casen_comunas_2021.xlsx")
casen_2021_rm_actualizada <- casen_2021_rm %>%
left_join(casen_comunas_2021, by = c("folio", "id_persona")) %>% #Las bases se unieron mediante folio e id persona
group_by(folio) %>%
mutate_all(~ifelse(. %in% c(-88, -99, 97,98,99), NA, .)) # Eliminamos valores faltantes
## `mutate_all()` ignored the following grouping variables:
## • Column `folio`
## ℹ Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
casen_2021_rm_actualizada
## # A tibble: 38,674 × 17
## # Groups: folio [13,202]
## folio id_persona region nse sexo edad e6a ytoth ytotcorh dau dautr
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1.00e8 1 13 2 2 54 11 2.95e6 2945500 8 7
## 2 1.00e8 2 13 2 2 28 11 2.95e6 2945500 8 7
## 3 1.00e8 3 13 2 2 27 13 2.95e6 2945500 8 7
## 4 1.00e8 4 13 2 2 19 11 2.95e6 2945500 8 7
## 5 1.00e8 5 13 2 1 56 11 2.95e6 2945500 8 7
## 6 1.00e8 1 13 2 1 81 5 6.42e5 963997 4 3
## 7 1.00e8 2 13 2 1 50 9 6.42e5 963997 4 3
## 8 1.00e8 1 13 2 2 59 11 4.15e5 415310 3 3
## 9 1.00e8 2 13 2 1 60 9 4.15e5 415310 3 3
## 10 1.00e8 1 13 2 2 52 11 7.15e5 714750 9 8
## # ℹ 38,664 more rows
## # ℹ 6 more variables: educ <dbl>, expr <dbl>, numper <dbl>, comuna <dbl>,
## # expp <dbl>, expc <dbl>
colnames(casen_2021)
casen_2021_rm_actualizada <- casen_2021_rm_actualizada %>%
mutate(comuna = as.character(comuna))
casen_2021 <- casen_2021_rm_actualizada %>%
left_join(comuna_codes_rm, by = "comuna") %>%
mutate(comuna = nombre_comuna) %>%
select(-nombre_comuna)
remove(casen_2021_rm, casen_comunas_2021, comuna_codes_rm, casen_2021_rm_actualizada) # Limpiamos BBDD que no usaremos
La variable DAU es el decil autonoma nacional para comparar el nivel socioeconomico de las personas. Por temas de anális observamos la región metropolitana. Pero puede ser llevado acabo a un nivel mayor a nivel país.
promedio_dau_comuna <- casen_2021 %>%
group_by(comuna) %>% # Agrupar por comuna
summarise(promedio_dau = round(mean(dau, na.rm = TRUE), 1)) # Calcular promedio de 'dau' redondeado a 1 decimal
promedio_dau_comuna
## # A tibble: 52 × 2
## comuna promedio_dau
## <chr> <dbl>
## 1 alhue 4.7
## 2 buin 4.7
## 3 calera de tango 4.5
## 4 cerrillos 5
## 5 cerro navia 4.5
## 6 colina 5
## 7 conchali 4.5
## 8 curacavi 4.3
## 9 el bosque 4.3
## 10 el monte 4
## # ℹ 42 more rows
# Reemplazamos Ñ por n para cruce con CASEN
eleccion_2021_primeravuelta <- eleccion_2021_primeravuelta %>%
mutate(across(everything(), ~str_replace_all(., "ñ", "n")))
eleccion_2021_segundavuelta <- eleccion_2021_segundavuelta %>%
mutate(across(everything(), ~str_replace_all(., "ñ", "n")))
# Realizar el cruce de bases por 'comuna'
datos_cruzados_primeravuelta <- eleccion_2021_primeravuelta %>%
left_join(promedio_dau_comuna, by = "comuna")
datos_cruzados_segundavuelta <- eleccion_2021_segundavuelta %>%
left_join(promedio_dau_comuna, by = "comuna")
datos_cruzados_primeravuelta
## # A tibble: 52 × 6
## # Groups: Distrito [7]
## Distrito comuna Total_Inscritos Total_Votacion Participacion_Porcen…¹
## <chr> <chr> <chr> <chr> <chr>
## 1 Distrito 10 la granja 102187 45371 44.4
## 2 Distrito 10 macul 100045 54600 54.6
## 3 Distrito 10 providencia 170892 96543 56.5
## 4 Distrito 10 san joaquin 80763 39445 48.8
## 5 Distrito 10 santiago 339067 136398 40.2
## 6 Distrito 10 nunoa 198985 123031 61.8
## 7 Distrito 11 la reina 90939 56792 62.5
## 8 Distrito 11 las condes 271386 171671 63.3
## 9 Distrito 11 lo barnech… 84259 55042 65.3
## 10 Distrito 11 penalolen 190640 95956 50.3
## # ℹ 42 more rows
## # ℹ abbreviated name: ¹Participacion_Porcentaje
## # ℹ 1 more variable: promedio_dau <dbl>
datos_cruzados_segundavuelta
## # A tibble: 52 × 6
## # Groups: Distrito [7]
## Distrito comuna Total_Inscritos Total_Votacion Participacion_Porcen…¹
## <chr> <chr> <chr> <chr> <chr>
## 1 Distrito 10 la granja 102187 55913 54.7
## 2 Distrito 10 macul 100045 64016 64
## 3 Distrito 10 providencia 170892 104693 61.3
## 4 Distrito 10 san joaquin 80763 48040 59.5
## 5 Distrito 10 santiago 339067 158676 46.8
## 6 Distrito 10 nunoa 198985 139003 69.9
## 7 Distrito 11 la reina 90939 63597 69.9
## 8 Distrito 11 las condes 271386 184227 67.9
## 9 Distrito 11 lo barnech… 84259 59439 70.5
## 10 Distrito 11 penalolen 190640 115888 60.8
## # ℹ 42 more rows
## # ℹ abbreviated name: ¹Participacion_Porcentaje
## # ℹ 1 more variable: promedio_dau <dbl>
Del cruce de bases CASEN y SERVEL, se puede desprender por medio de la tabla que las comunas con un porcentaje de participación más alto como, por ejemplo, Las Condes (63.25%), Vitacura (69.26%), Providencia (56.49%), Ñuñoa (61.82%) y Lo Barnechea (65.32%), poseen un promedio decil comunal más alto (sobre 7), que para las comunas mencionadas anteriormente serían de 8.38, 9, 8.76, 7.73 y 7.05, respectivamente. En cambio, para las comunas con un porcentaje de participación más bajo como, por ejemplo, La Pintana (40.37%), Renca (44.24%), El Bosque (45.39%), La Granja (44.39%) y María Pinto (46.81%), poseen un promedio decil comunal más bajo (bajo 5): 3.62, 3.92, 4.27, 4.23 y 3.8, respectivamente.
# Transformamos promedio dau a númerica
datos_cruzados_primeravuelta <- datos_cruzados_primeravuelta %>%
mutate(promedio_dau = as.numeric(promedio_dau))
# Filtrar y calcular el promedio de 'promedio_dau' por comuna
promedio_dau_comuna <- datos_cruzados_primeravuelta %>%
filter(!is.na(promedio_dau) & promedio_dau >= 0) %>%
group_by(comuna) %>%
summarise(promedio_dau_comuna = mean(promedio_dau, na.rm = TRUE)) # Cambié la suma por el promedio
# Mapa desde el paquete Chile Mapas
comunas_santiago <- mapa_comunas %>%
filter(codigo_region == 13) %>%
left_join(
codigos_territoriales %>%
select(matches("comuna"))
) %>%
mutate(nombre_comuna = str_trim(tolower(nombre_comuna))) %>% # Convertir a minúsculas y quitar espacios
left_join(promedio_dau_comuna %>%
mutate(comuna = str_trim(tolower(comuna))), by = c("nombre_comuna" = "comuna")) # Unir el promedio por comuna
## Joining with `by = join_by(codigo_comuna)`
paleta <- c("#DCA761", "#CFB567", "#BFBC71", "#9EA887", "#819897")
# Gráfico 4
Gráfico_4 <- ggplot(comunas_santiago) +
geom_sf(aes(fill = promedio_dau_comuna, geometry = geometry)) +
scale_fill_gradientn(colours = rev(paleta), name = "Promedio Decil por comuna") + # Usar el promedio de DAU
labs(title = "Promedio DAU por Comuna en 2021") +
theme_minimal(base_size = 13) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5)
)
Gráfico_4 <- ggplotly(Gráfico_4) # Gráfico interactivo
Gráfico_4
# Transformamos promedio dau a númerico
datos_cruzados_segundavuelta <- datos_cruzados_segundavuelta %>%
mutate(promedio_dau = as.numeric(promedio_dau))
# Filtrar y calcular el promedio de 'promedio_dau' por comuna
promedio_dau_comuna <- datos_cruzados_segundavuelta %>%
filter(!is.na(promedio_dau) & promedio_dau >= 0) %>%
group_by(comuna) %>%
summarise(promedio_dau_comuna = mean(promedio_dau, na.rm = TRUE)) # Cambié la suma por el promedio
# Mapa desde el paquete Chile Mapas
comunas_santiago <- mapa_comunas %>%
filter(codigo_region == 13) %>%
left_join(
codigos_territoriales %>%
select(matches("comuna"))
) %>%
mutate(nombre_comuna = str_trim(tolower(nombre_comuna))) %>% # Convertir a minúsculas y quitar espacios
left_join(promedio_dau_comuna %>%
mutate(comuna = str_trim(tolower(comuna))), by = c("nombre_comuna" = "comuna")) # Unir el promedio por comuna
## Joining with `by = join_by(codigo_comuna)`
paleta <- c("#DCA761", "#CFB567", "#BFBC71", "#9EA887", "#819897")
# Gráfico 4
Gráfico_5 <- ggplot(comunas_santiago) +
geom_sf(aes(fill = promedio_dau_comuna, geometry = geometry)) +
scale_fill_gradientn(colours = rev(paleta), name = "Promedio Decil por comuna") + # Usar el promedio de DAU
labs(title = "Promedio DAU por Comuna en 2021") +
theme_minimal(base_size = 13) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5)
)
Gráfico_5 <- ggplotly(Gráfico_5) # Gráfico interactivo
Gráfico_5
# Gráfico 2021
Gráfico_6 <- plot_grid(
Gráfico_4 + theme(legend.position = "none"),
Gráfico_5 + theme(legend.position = "none"),
align = "v",
ncol = 2
)
# Usamos la misma leyenda
leyenda <- get_legend(Gráfico_4)
## Warning in as_grob.default(plot): Cannot convert object of class
## plotlyhtmlwidget into a grob.
# Combinar gráficos y leyenda
plot_grid(Gráfico_6, leyenda, ncol = 1, rel_heights = c(0.81, 0.5))
# Creamos una clasificación simplificada de nivel educacional
casen_2021 <- casen_2021 %>%
mutate(nivel_educacional = case_when(
# Sin educación formal o básica incompleta
e6a %in% c(1, 2, 3, 4, 5, 6) | is.na(e6a) ~ "Básica o menos",
# Educación básica completa y media (completa o incompleta)
e6a %in% c(7, 8, 9, 10) ~ "Media",
# Educación técnica (en cualquier nivel)
e6a %in% c(11, 12) ~ "Técnica",
# Educación universitaria o superior (incluye postgrados)
e6a %in% c(13, 14, 15) ~ "Universitaria",
# Por si hay algún caso no considerado
TRUE ~ "No especificado"
))
# Creamos una visualización que muestra la distribución por comuna
educacion_comuna <- casen_2021 %>%
# Agrupamos por comuna y nivel educacional para contar
group_by(comuna, nivel_educacional) %>%
summarise(cantidad = n(), .groups = 'drop') %>%
# Calculamos el porcentaje dentro de cada comuna
group_by(comuna) %>%
mutate(porcentaje = (cantidad / sum(cantidad)) * 100) %>%
ungroup()
# Creamos un resumen general de la distribución
resumen_educacional <- casen_2021 %>%
group_by(nivel_educacional) %>%
summarise(
cantidad = n(),
porcentaje = round((cantidad / nrow(casen_2021)) * 100, 1)
) %>%
arrange(desc(porcentaje))
# Mostramos el resumen
resumen_educacional
## # A tibble: 4 × 3
## nivel_educacional cantidad porcentaje
## <chr> <int> <dbl>
## 1 Media 18159 47
## 2 Universitaria 9070 23.5
## 3 Técnica 6883 17.8
## 4 Básica o menos 4562 11.8
perfil_educacional_comunal <- casen_2021 %>%
group_by(comuna, nivel_educacional) %>%
summarise(cantidad = n(), .groups = 'drop') %>%
group_by(comuna) %>%
mutate(
porcentaje_educacion = (cantidad / sum(cantidad)) * 100,
total_comuna = sum(cantidad)
) %>%
ungroup()
# Ahora preparamos los datos de participación electoral
# Usaremos la primera vuelta como ejemplo, pero podríamos hacer lo mismo con la segunda
datos_participacion <- eleccion_2021_primeravuelta %>%
select(comuna, Participacion_Porcentaje) %>%
mutate(comuna = str_to_lower(comuna)) # Convertimos a minúsculas para hacer match con CASEN
## Adding missing grouping variables: `Distrito`
# Ahora unimos ambos conjuntos de datos
analisis_educacion_participacion <- perfil_educacional_comunal %>%
mutate(comuna = str_to_lower(comuna)) %>% # Convertimos a minúsculas para hacer match
left_join(datos_participacion, by = c("comuna" = "comuna"))
# Creamos una visualización que muestre la relación entre nivel educacional y participación
analisis_educacion_participacion$Participacion_Porcentaje <- as.numeric(analisis_educacion_participacion$Participacion_Porcentaje)
gráfico_7 <- ggplot(analisis_educacion_participacion,
aes(x = porcentaje_educacion,
y = Participacion_Porcentaje,
color = nivel_educacional)) +
geom_point(size = 3, alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~nivel_educacional) +
labs(
title = "Relación entre Nivel Educacional y Participación Electoral por Comuna",
subtitle = "Región Metropolitana - Primera Vuelta 2021",
x = "Porcentaje de población con nivel educacional",
y = "Porcentaje de participación electoral",
color = "Nivel Educacional"
) +
theme_minimal() +
theme(legend.position = "bottom") +
scale_y_continuous(
breaks = seq(0, 100, by = 20), # Establecer saltos de 20 en el eje y
labels = scales::percent_format(scale = 1) # Formato como porcentaje
)
gráfico_7
## `geom_smooth()` using formula = 'y ~ x'
gráfico_7_interactivo <- ggplotly(gráfico_7)
## `geom_smooth()` using formula = 'y ~ x'
gráfico_7_interactivo
# También podemos calcular la correlación entre educación universitaria y participación
analisis_educacion_participacion <- analisis_educacion_participacion %>%
mutate(
porcentaje_educacion = as.numeric(porcentaje_educacion),
Participacion_Porcentaje = as.numeric(Participacion_Porcentaje)
)
correlacion_universitaria <- analisis_educacion_participacion %>%
filter(nivel_educacional == "Universitaria") %>%
ungroup() %>% # Deshacer cualquier agrupamiento previo
filter(!is.na(porcentaje_educacion) & !is.na(Participacion_Porcentaje)) %>%
summarise(
correlacion = cor(porcentaje_educacion, Participacion_Porcentaje, use = "complete.obs")
)
# Y crear una tabla resumen que muestre los promedios de participación
# según el nivel predominante de educación en cada comuna
resumen_participacion <- analisis_educacion_participacion %>%
group_by(comuna) %>%
mutate(nivel_predominante = nivel_educacional[which.max(porcentaje_educacion)]) %>%
group_by(nivel_predominante) %>%
summarise(
participacion_promedio = mean(Participacion_Porcentaje, na.rm = TRUE),
n_comunas = n_distinct(comuna)
) %>%
arrange(desc(participacion_promedio))
# Mostramos los resultados
print("Correlación entre educación universitaria y participación:")
## [1] "Correlación entre educación universitaria y participación:"
print(correlacion_universitaria)
## # A tibble: 1 × 1
## correlacion
## <dbl>
## 1 0.729
print("\nResumen de participación por nivel educacional predominante:")
## [1] "\nResumen de participación por nivel educacional predominante:"
print(resumen_participacion)
## # A tibble: 2 × 3
## nivel_predominante participacion_promedio n_comunas
## <chr> <dbl> <int>
## 1 Universitaria 58.9 6
## 2 Media 47.9 46
Los datos muestran que las comunas donde predomina la educación universitaria presentan una participación electoral promedio significativamente mayor (58.9%) en comparación con aquellas donde predomina la educación media (47.9%). Este hallazgo se refuerza al observar las líneas de tendencia en el gráfico de dispersión. En contraste, observamos una tendencia descendente para los niveles de educación media y técnica, sugiriendo que a mayor proporción de población con estos niveles educativos, menor es la participación electoral. Es particularmente notable que solo seis comunas muestran predominancia de educación universitaria, mientras que 46 comunas se caracterizan por un predominio de educación media.